package com.atguigu.daijia.order.service;

import com.atguigu.daijia.model.entity.order.OrderInfo;
import com.atguigu.daijia.model.form.order.OrderInfoForm;
import com.atguigu.daijia.model.form.order.StartDriveForm;
import com.atguigu.daijia.model.form.order.UpdateOrderBillForm;
import com.atguigu.daijia.model.form.order.UpdateOrderCartForm;
import com.atguigu.daijia.model.vo.base.PageVo;
import com.atguigu.daijia.model.vo.order.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;

public interface OrderInfoService extends IService<OrderInfo> {
    /**
     * 保存订单信息
     * @param orderInfoForm
     * @return
     */
    Long saveOrderInfo(OrderInfoForm orderInfoForm);

    /**
     * 根据订单 ID 查询订单状态
     * @param orderId
     * @return
     */
    Integer getOrderStatus(Long orderId);

    /**
     * 司机抢单
     * @param driverId
     * @param orderId
     * @return
     */
    Boolean robNewOrder(Long driverId, Long orderId);

    /**
     * 查询乘客执行中订单基本信息
     * @param customerId
     * @return
     */
    CurrentOrderInfoVo searchCustomerCurrentOrder(Long customerId);

    /**
     * 查询司机执行中订单基本信息
     * @param driverId
     * @return
     */
    CurrentOrderInfoVo searchDriverCurrentOrder(Long driverId);

    /**
     * 接单司机到达代驾订单起始点
     * @param orderId
     * @param driverId
     * @return
     */
    Boolean driverArriveStartLocation(Long orderId, Long driverId);

    /**
     * 更新代驾车辆信息
     * @param updateOrderCartForm
     * @return
     */
    Boolean updateOrderCar(UpdateOrderCartForm updateOrderCartForm);

    /**
     * 开始代驾服务
     * @param startDriveForm
     * @return
     */
    Boolean startDrive(StartDriveForm startDriveForm);

    /**
     * 根据时间获取订单数量
     * @param startTime
     * @param endTime
     * @param driverId
     * @return
     */
    Long getOrderNumByTime(String startTime, String endTime, Long driverId);

    /**
     * 结束代驾服务更新数据库表信息
     * @param updateOrderBillForm
     * @return
     */
    Boolean endDrive(UpdateOrderBillForm updateOrderBillForm);

    /**
     * 分页查询乘客订单列表
     * @param pageParam
     * @param customerId
     * @return
     */
    PageVo findCustomerOrderPage(Page<OrderInfo> pageParam, Long customerId);

    /**
     * 分页查询司机订单列表
     * @param pageParam
     * @param driverId
     * @return
     */
    PageVo findDriverOrderPage(Page<OrderInfo> pageParam, Long driverId);

    /**
     * 根据订单 ID 查询订单账单信息
     * @param orderId
     * @return
     */
    OrderBillVo getOrderBillInfo(Long orderId);

    /**
     * 根据订单 ID 查询订单分账信息
     * @param orderId
     * @return
     */
    OrderProfitsharingVo getOrderProfitsharing(Long orderId);

    /**
     * 发送订单的账单信息给乘客
     * @param orderId
     * @param driverId
     * @return
     */
    Boolean sendOrderBillInfo(Long orderId, Long driverId);

    /**
     * 查询订单支付信息
     * @param orderNo
     * @param customerId
     * @return
     */
    OrderPayVo getOrderPayVo(String orderNo, Long customerId);

    /**
     * 更新订单支付状态
     * @param orderNo
     * @return
     */
    Boolean updateOrderPayStatus(String orderNo);

    /**
     * 获取订单的系统奖励
     * @param orderNo
     * @return
     */
    OrderRewardVo getOrderRewardFee(String orderNo);

    /**
     * 根据订单 ID 取消订单
     * @param orderId
     */
    void cancelOrder(Long orderId);

    /**
     * 更新订单优惠券金额
     * @param orderId
     * @param couponAmount
     * @return
     */
    Boolean updateOrderCouponAmount(Long orderId, BigDecimal couponAmount);
}
